import os
from typing import Dict, Any
from dotenv import load_dotenv
from .thresholds import (
    RAGThresholds,
    KnowledgeBaseThresholds,
    EmbeddingThresholds,
    ModelThresholds,
    SecurityThresholds,
    ValidationThresholds
)

# 加载环境变量
load_dotenv()

class Config:
    """项目配置类"""
    
    # API配置
    OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "3fd1db3b-eaf9-48d5-90cc-d448a9xxxxxx")
    OPENAI_BASE_URL = os.getenv("OPENAI_BASE_URL", "https://ark.cn-beijing.volces.com/api/v3")
    
    # 模型配置
    LLM_MODEL_NAME = os.getenv("LLM_MODEL_NAME", "doubao-1-5-pro-32k-250115")
    EMBEDDING_MODEL_NAME = os.getenv("EMBEDDING_MODEL_NAME", "doubao-embedding-large-text-250515")
    
    # 服务配置
    HOST = os.getenv("HOST", "0.0.0.0")
    PORT = int(os.getenv("PORT", "5000"))
    DEBUG = os.getenv("DEBUG", "True").lower() == "false"  # 启用热部署
    
    # 向量数据库配置
    VECTOR_DB_PATH = os.getenv("VECTOR_DB_PATH", "./vector_db")
    
    # RAG配置
    CHUNK_SIZE = int(os.getenv("CHUNK_SIZE", str(KnowledgeBaseThresholds.DEFAULT_CHUNK_SIZE)))
    CHUNK_OVERLAP = int(os.getenv("CHUNK_OVERLAP", str(KnowledgeBaseThresholds.DEFAULT_CHUNK_OVERLAP)))
    TOP_K_RETRIEVAL = int(os.getenv("TOP_K_RETRIEVAL", str(RAGThresholds.DEFAULT_TOP_K)))
    
    # 监控配置
    MONITORING_ENABLED = os.getenv("MONITORING_ENABLED", "true").lower() == "true"
    TRACE_ENABLED = os.getenv("TRACE_ENABLED", "true").lower() == "true"
    METRICS_ENABLED = os.getenv("METRICS_ENABLED", "true").lower() == "true"
    
    # Langfuse配置
    LANGFUSE_PUBLIC_KEY = os.getenv("LANGFUSE_PUBLIC_KEY", "pk-lf-73b135d1-ac15-4da4-85c0-7e9xxxxxxxxx")
    LANGFUSE_SECRET_KEY = os.getenv("LANGFUSE_SECRET_KEY", "sk-lf-60f3b528-5673-xxxd-afef-b49a0xxxxxxx")
    LANGFUSE_HOST = os.getenv("LANGFUSE_HOST", "https://test.langfuse.cyouai.com")
    LANGFUSE_ENABLED = os.getenv("LANGFUSE_ENABLED", "true").lower() == "true"
    
    # OpenTelemetry配置 (2.x版本不需要)
    # OTEL_EXPORTER_OTLP_TRACES_ENDPOINT = os.getenv("OTEL_EXPORTER_OTLP_TRACES_ENDPOINT", "")
    # OTEL_EXPORTER_OTLP_HEADERS = os.getenv("OTEL_EXPORTER_OTLP_HEADERS", "")
    
    # 性能监控阈值
    SLOW_QUERY_THRESHOLD_MS = int(os.getenv("SLOW_QUERY_THRESHOLD_MS", "5000"))
    ERROR_RATE_THRESHOLD = float(os.getenv("ERROR_RATE_THRESHOLD", "0.05"))
    
    # 日志配置
    LOG_LEVEL = os.getenv("LOG_LEVEL", "INFO")
    LOG_FORMAT = os.getenv("LOG_FORMAT", "%(asctime)s - %(name)s - %(levelname)s - %(message)s")
    
    # Commit Message提示词模板
    COMMIT_PROMPT = """
你是一个专业的Git commit message生成助手。请根据提供的多个commit messages，将它们合并成一个符合Conventional Commits规范的完整commit message。

## 任务说明：
你需要将多个独立的commit messages合并成一个统一的commit message，而不是简单地将它们组装在一起。请分析所有commit messages的内容，提取共同的主题和类型，生成一个能够概括所有变更的完整commit message，包含类型，范围，主题、正文和页脚。

## Commit Message格式要求：

### 完整格式：
```
<type>(<scope>): <subject>

<body>

<footer>
```

### 各部分详细说明：
- **类型（type）**：必填，标识变更性质（如功能新增、问题修复等）
- **范围（scope）**：必填，指定变更影响的模块/组件（英文，如user、pay、core等）
- **主题（subject）**：必填，简洁描述变更核心内容（中文，不超过50字，以动词开头）
- **正文（body）**：必填，详细说明变更内容、实现方式、影响范围等（中文，每行不超过72字）
- **页脚（footer）**：必填，用于标注破坏性变更、关联Issue或Breaking Changes

### 类型对照表：
| 类型 | 中文含义 | 使用场景 |
|------|----------|----------|
| `feat` | 功能新增 | 新增业务功能、接口或交互逻辑 |
| `fix` | 问题修复 | 修复bug、异常场景或兼容性问题 |
| `docs` | 文档更新 | 修改注释、接口文档、使用说明等非代码内容 |
| `style` | 代码格式 | 调整缩进、空格、命名规范等不影响逻辑的变更 |
| `refactor` | 代码重构 | 优化代码结构、算法逻辑，不新增功能或修复bug |
| `test` | 测试相关 | 添加/修改单元测试、集成测试等 |
| `chore` | 构建/依赖 | 更新依赖包、构建脚本、配置文件等 |

### 输入的多个Commit Messages：
{change_content}

### 合并策略：
1. **分析所有commit messages的类型**：识别主要的变更类型（feat、fix、refactor等）
2. **提取共同主题**：找到所有变更的共同主题或目标
3. **确定scope**：如果多个变更影响相同模块，使用该模块作为scope
4. **生成统一subject**：用简洁的中文描述概括所有变更的核心内容
5. **选择主导类型**：如果类型不一致，选择最重要的类型作为主导类型
6. **编写详细正文**：列出具体的变更内容，说明实现的功能和改进
7. **添加页脚信息**：如果有破坏性变更或需要特别说明的内容

### 正文编写要求：
- 详细说明本次提交包含的所有变更内容
- 列出具体的功能改进、修复的问题或优化的部分
- 说明变更的影响范围和注意事项
- 使用中文，每行不超过72个字符
- 用项目符号（-）列出主要变更点

### 页脚编写要求：
- 如果有破坏性变更，使用 `BREAKING CHANGE:` 开头
- 如果有相关Issue，使用 `Closes #123` 或 `Fixes #123` 格式
- 如果有特殊说明，使用 `Note:` 开头

### 重要提示：
1. 必须严格按照完整格式生成，包含标题、正文和页脚
2. type 必须是英文，从上述类型对照表中选择
3. scope 是可选的，如果变更影响特定模块则添加
4. subject 用中文描述，以动词开头，简洁明了，能够概括所有变更
5. 正文必须详细说明所有变更内容，不要简单重复标题
6. 不要简单地将多个commit messages用分号连接，而是要真正合并成一个统一的message

### 示例：
**输入：**
- `feat(logs): 为日志配置添加编码设置`
- `feat(utils): 增强异常处理逻辑并添加特定运行时错误处理`
- `feat(documcp): 新增应用和配置项`
- `feat(.gitignore): 添加项目特定文件及多种类型文件的忽略配置`

**输出：**
```
feat(core): 完善项目基础设施和配置管理

- 为日志配置添加编码设置，提升日志输出的可读性和兼容性
- 增强异常处理逻辑，添加特定运行时错误处理机制
- 新增应用和配置项，扩展项目功能模块
- 完善.gitignore文件规则，添加项目特定文件及多种类型文件的忽略配置

Note: 本次更新主要针对项目基础设施进行完善，提升开发体验和项目稳定性
```

请根据提供的多个commit messages，生成一个完整的、符合规范的commit message：
"""
    
    @classmethod
    def get_commit_prompt(cls, **kwargs) -> str:
        """获取格式化的commit message提示词"""
        return cls.COMMIT_PROMPT.format(**kwargs)
    
    # OpenTelemetry方法 (2.x版本不需要)
    # @classmethod
    # def get_otel_auth_header(cls) -> str:
    #     """生成OpenTelemetry认证头"""
    #     import base64
    #     auth_string = f"{cls.LANGFUSE_PUBLIC_KEY}:{cls.LANGFUSE_SECRET_KEY}"
    #     auth_bytes = auth_string.encode('ascii')
    #     auth_b64 = base64.b64encode(auth_bytes).decode('ascii')
    #     return f"authorization=Basic {auth_b64}"
    # 
    # @classmethod
    # def get_otel_endpoint(cls) -> str:
    #     """获取OpenTelemetry端点"""
    #     # 如果环境变量中设置了自定义端点，使用自定义端点
    #     if cls.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT:
    #     return cls.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
    # else:
    #     # 否则使用默认的Langfuse端点
    #     return f"{cls.LANGFUSE_HOST}/api/public/otel/v1/traces" 